/// 将字符串表示的数字从其原始进制转换为指定的目标进制
///
/// # 参数
/// - `num_str`: 输入的数字字符串，格式为 "<数值>(<原进制>)"。
/// - `to_base`: 目标进制，范围是 2 到 16。
///
/// # 返回
/// 转换后的字符串表示，如果输入无效，返回 "错误" 字符串。
pub fn convert_base(num_str: &str, to_base: u32) -> String {
    // 解析输入字符串，格式为 "<数值>(<原进制>)"
    let parts: Vec<&str> = num_str.split('(').collect();
    if parts.len() != 2 {
        return "输入格式错误，应为 '<数值>(<原进制>)'".to_string();
    }

    let value = parts[0];
    let from_base: u32 = parts[1].trim_end_matches(')').parse().unwrap_or(0);

    // 检查进制范围
    if from_base < 2 || from_base > 16 || to_base < 2 || to_base > 16 {
        return "不支持的进制".to_string();
    }

    // 转换为十进制
    let decimal_value = match u64::from_str_radix(value, from_base) {
        Ok(val) => val,
        Err(_) => return "输入字符串包含无效数字".to_string(),
    };

    // 从十进制转换到目标进制
    let mut num = decimal_value;
    let mut result = String::new();

    // 特殊处理 0 的情况
    if num == 0 {
        return "0".to_string();
    }

    while num > 0 {
        let remainder = (num % u64::from(to_base)) as u32;
        let char = if remainder < 10 {
            (b'0' + remainder as u8) as char
        } else {
            (b'a' + (remainder - 10) as u8) as char
        };
        result.push(char);
        num /= u64::from(to_base);
    }

    result.chars().rev().collect() // 反转字符串以得到正确的顺序
}

// 为了防止string转换为u32时溢出，这里使用了u64。
// 向十进制的转换使用了u64::from_str_radix，而从十进制转换到目标进制时使用了u64::from。可以尽可能避免溢出的问题。